package ezcaptcha

import (
	"errors"
	"fmt"
)

type ErrResp struct {
	ErrorId          int    `json:"errorId"`
	ErrorCode        string `json:"errorCode"`
	ErrorDescription string `json:"errorDescription"`
}

func (e *ErrResp) Error() string {
	return fmt.Sprintf("errorId: %d, errorCode: %s, errorDescription: %s",
		e.ErrorId, e.ErrorCode, e.ErrorDescription)
}

func (e *ErrResp) Is(err error) bool {
	t, ok := err.(*ErrResp)
	if !ok {
		return false
	}
	return t.ErrorCode == e.ErrorCode
}

func (e *ErrResp) CanRetry() bool {
	return e.ErrorCode == ErrInternalServer.ErrorCode
}

var (
	ErrWaitForResultTimeout = errors.New("wait for result timeout")

	// ---------------- 通用 API 错误码

	ErrInternalServer    = &ErrResp{ErrorCode: "ERROR_INTERNAL_SERVER_ERROR"} //服务器内部错误
	ErrRequestParameters = &ErrResp{ErrorCode: "ERROR_REQUEST_PARAMETERS"}    //参数校验未通过
	ErrNotFound          = &ErrResp{ErrorCode: "ERROR_NOT_FOUND"}             //请求目标找不到
	ErrRequestMethod     = &ErrResp{ErrorCode: "ERROR_REQUEST_METHOD"}        //请求方式不支持
	ErrRequestLimit      = &ErrResp{ErrorCode: "ERROR_REQUEST_LIMIT"}         //请求被限流
	ErrRequestBanned     = &ErrResp{ErrorCode: "ERROR_REQUEST_BANNED"}        //请求被屏蔽

	// ---------------- 任务创建失败错误码

	ErrTaskTypeNotSupported        = &ErrResp{ErrorCode: "ERROR_TASK_TYPE_NOT_SUPPORTED"}         // 任务类型不支持
	ErrPackageTaskTypeNotSupported = &ErrResp{ErrorCode: "ERROR_PACKAGE_TASK_TYPE_NOT_SUPPORTED"} // 任务类型不支持
	ErrTaskTypeNotAvailable        = &ErrResp{ErrorCode: "ERROR_TASK_TYPE_NOT_AVAILABLE"}         // 任务类型不可用
	ErrKeyDoesNotExist             = &ErrResp{ErrorCode: "ERROR_KEY_DOES_NOT_EXIST"}              // 请求秘钥不存在
	ErrKeyNotAvailable             = &ErrResp{ErrorCode: "ERROR_KEY_NOT_AVAILABLE"}               // 秘钥不可用
	ErrSubscriptionExpired         = &ErrResp{ErrorCode: "ERROR_SUBSCRIPTION_EXPIRED"}            // 订阅已过期
	ErrZeroBalance                 = &ErrResp{ErrorCode: "ERROR_ZERO_BALANCE"}                    // 余额不足
	ErrWebsiteNotAllowed           = &ErrResp{ErrorCode: "ERROR_WEBSITE_NOT_ALLOWED"}             // 不允许的目标站点

	// ---------------- 任务识别失败错误码

	ErrNoSlotAvailable = &ErrResp{ErrorCode: "ERROR_NO_SLOT_AVAILABLE"}

	// ---------------- ReCaptcha

	ErrInvalidDomainForSitekey = &ErrResp{ErrorCode: "INVALID_DOMAIN_FOR_SITEKEY"} // 站点密钥的域名无效

	// ---------------- CloudFlare

	ErrCloudflareProxyEmpty                    = &ErrResp{ErrorCode: "Cloudflare_PROXY_EMPTY"}                                  // 代理不能为空，请以http://username:password@ip:port格式上传代理。代理账号和密码为必填项。
	ErrCloudflareProxyAccessError              = &ErrResp{ErrorCode: "Cloudflare_PROXY_ACCESS_ERROR"}                           // 代理访问站点异常，请更换代理或重新请求。
	ErrCloudflareAccessDeniedWebsite           = &ErrResp{ErrorCode: "Cloudflare_ACCESS_DENIED_WEBSITE"}                        // 访问该网站被拒绝。请勿访问此网站。
	ErrCloudflareProxyFormatError              = &ErrResp{ErrorCode: "Cloudflare_PROXY_FORMAT_ERROR"}                           // 代理解析错误，请以http://username:password@ip:port格式上传代理。
	ErrCloudflareChallengeFailed               = &ErrResp{ErrorCode: "Cloudflare_CHALLENGE_FAILED"}                             // WAF挑战失败，请联系管理员。
	ErrCloudflareWebsite403Status              = &ErrResp{ErrorCode: "Cloudflare_WEBSITE_403_STATUS"}                           // 通过代理访问该网站返回了403状态码，请更换代理服务器或切换代理国家。
	ErrCloudflareProxy407AuthorizationRequired = &ErrResp{ErrorCode: "Cloudflare_PROXY_407_AUTHORIZATION_REQUIRED"}             // 代理服务器返回407代理授权所需状态码，请检查您的代理设置。
	ErrCloudflareProxyLocalIpForbidden         = &ErrResp{ErrorCode: "Cloudflare_PROXY_LOCAL_IP_FORBIDDEN"}                     // 代理服务器不能使用本地IP地址。请正确上传代理服务器信息。代理格式为http://username:password@ip:port。代理账户和密码为必填项。
	ErrCloudflareProxy403Forbidden             = &ErrResp{ErrorCode: "Cloudflare_PROXY_403_FORBIDDEN"}                          // 代理服务器返回403禁止访问错误。请确认您的代理账户密码正确且代理服务可用。
	ErrCloudflareProxy430AuthorizationFailed   = &ErrResp{ErrorCode: "Cloudflare_PROXY_430_AUTHORIZATION_FAILED"}               // 代理服务器返回430授权失败，请检查您的代理设置。
	ErrCloudflareProxyAuthorizationFailed      = &ErrResp{ErrorCode: "Cloudflare_PROXY_USERNAME_PASSWORD_AUTHORIZATION_FAILED"} // 代理 用户名/密码 验证失败，请检查您的代理设置。
	ErrCloudflareProxy502BadGateway            = &ErrResp{ErrorCode: "Cloudflare_PROXY_502_BAD_GATEWAY"}                        // 代理服务器返回502网关错误，请检查您的代理设置。
	ErrCloudflareProxy459InsufficientTraffic   = &ErrResp{ErrorCode: "Cloudflare_PROXY_459_INSUFFICIENT_TRAFFIC"}               // 代理服务器返回459流量不足错误。请检查您的代理设置。
	ErrCloudflareProxyConnectionRefused        = &ErrResp{ErrorCode: "Cloudflare_PROXY_CONNECTION_REFUSED"}                     // 代理服务器返回连接被拒绝。请检查您的代理设置。
	ErrCloudflareProxyClientTimeout            = &ErrResp{ErrorCode: "Cloudflare_PROXY_CLIENT_TIMEOUT"}                         // 代理客户端超时，请重试。
)
